<?php
class cars {
  
  function __construct() {
  }

  public function listcars() {
    $data = new jqGridData();
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

		$rwd = $_SESSION['priv']->cars->rwd;
		if( !$rwd  ) throw new Exception(ERR_M::DATA_ACC_DISABLED, 99);

// Проверяем данные
        $page    = ( isset($_REQUEST["page"]) && $_REQUEST["page"] > 0 ) ? $_REQUEST["page"] : 1;
        $limit    = ( isset($_REQUEST["rows"]) && $_REQUEST["rows"] > 0 ) ? $_REQUEST["rows"] : 1;
        $sidx    = ( isset($_REQUEST["sidx"]) && $_REQUEST["sidx"] != '' ) ? $_REQUEST["sidx"] : 'car_depnum';
        $sord    = ( isset($_REQUEST["sord"]) && strtolower($_REQUEST["sord"]) == 'desc' ) ? 'DESC' : 'ASC';
        $search    = ( isset($_REQUEST["_search"]) && strtolower($_REQUEST["_search"]) == 'true') ? true : false;
 
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Фильтр
        $whc = array();
		
        if( $search )
        {
            if(isset($_REQUEST["id"]) && ctype_digit($_REQUEST["id"]) ) {
				$whc[] = "car_id=" . $db->quote($_REQUEST["id"]);
		    }
            
            if(isset($_REQUEST["status"]) && ctype_digit($_REQUEST["status"]) ) {
				$whc[] = "status=" . $db->quote($_REQUEST["status"]);
		    }
            
            if(isset($_REQUEST["car_depnum"]) && $_REQUEST["car_depnum"] != "") {
				$whc[] = "car_depnum LIKE " . $db->quote("%".$_REQUEST["car_depnum"]."%");
            }
			
            if(isset($_REQUEST["car_model"]) && $_REQUEST["car_model"] != "") {
				$whc[] = "car_model LIKE " . $db->quote("%".$_REQUEST["car_model"]."%");
            }
			
            if(isset($_REQUEST["car_release"]) && $_REQUEST["car_release"] != "") {
		    	$whc[] = "car_release LIKE " . $db->quote($_REQUEST["car_release"]."%");
            }
			
            if(isset($_REQUEST["car_engcap"]) && $_REQUEST["car_engcap"] != "") {
		    	$whc[] = "car_engcap LIKE " . $db->quote($_REQUEST["car_engcap"]."%");
            }
			
            if(isset($_REQUEST["car_body"]) && $_REQUEST["car_body"] != "") {
		    	$whc[] = "car_body LIKE " . $db->quote($_REQUEST["car_body"]."%");
            }
			
            if(isset($_REQUEST["car_mot"]) && ( $dt = Tools::date_to_search_str( $_REQUEST["car_mot"] )) != "") {
				$whc[] = "car_mot LIKE " . $db->quote($dt."%");
            }
			
            if(isset($_REQUEST["car_insur"]) && ( $dt = Tools::date_to_search_str( $_REQUEST["car_insur"] )) != "") {
				$whc[] = "car_insur LIKE " . $db->quote($dt."%");
            }
			
            if(isset($_REQUEST["car_comment"]) && $_REQUEST["car_comment"] != "") {
		    	$whc[] = "car_commentLIKE " . $db->quote("%".$_REQUEST["car_comment"]."%");
            }			
		}

// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whc[] = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whc[] = 'car_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whc[] = 'car_user_id = '.$_SESSION['user_id'];
		else $whc[] = '1 = 0';

// Окончательно формируем условие
        $whereclaus = (count($whc) != 0 ) ? " WHERE " . implode(" AND ", $whc) : "";
		unset($whc);
            
// Получаем количество записей с учетом фильтра
        $sql = "SELECT COUNT(*) AS count FROM cars $whereclaus";
        $rs = $db->query( $sql );
		$row = $rs->fetchObject();
		$count = $row->count;
		$rs->closeCursor();
            
// Пустая таблица
        if ($count == 0)
			throw new Exception(ERR_M::SUCCESS, 0);
            
// Рассчитаем сколько всего страниц займут данные в БД
    	if( $count > 0 && $limit > 0) {
    		$total_pages = ceil($count/$limit);
    	} else {
    		$total_pages = 0;
    	}                  
 
		if ($page > $total_pages) $page=$total_pages;                  
 
		$start = $limit*$page - $limit;                   
		if($start < 0) $start = 0;                  
 
// Формируем запрос
		$sql = 	"SELECT car_id, car_depnum, car_model, car_release, car_engcap, car_body, car_mot, car_insur, car_comment ".
				"FROM cars ".$whereclaus." ORDER BY ".$sidx." ".$sord.
		        " LIMIT ".$start.", ".$limit;

		$rs = $db->query($sql);                  
 
// Формирование объекта для возврата
        
    	$data->page      = $page;
    	$data->total     = $total_pages;
    	$data->records   = $count;
    		
    // Строки данных для таблицы
		$i = 0;
		$currdate = date('Y-m-d');
		while( $row = $rs->fetchObject() ) {
			$status = 0;			
			$data->rows[$i]['id'] = $row->car_id;
			$data->rows[$i]['cell'] = array(
					$row->car_id,
					$status,
					$row->car_depnum,
					$row->car_model,
					$row->car_release,
					$row->car_engcap,
					$row->car_body,
					Tools::str_iso2local_date( $row->car_mot ),
					Tools::str_iso2local_date( $row->car_insur ),
					$row->car_comment
		    );
		    $i++;
		}
    }
	catch (PDOException $e) {
		$data->userdata->errcode = 1;
		$data->userdata->errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$data->userdata->errcode = $e->getCode();
		$data->userdata->errmess = $e->getMessage();
	}
 
	return $data;
  }
  
  
  public function carstatus() {
	$data = 0;
	$errcode = 0;
	$errmess = '';
	try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

		$rwd = $_SESSION['priv']->cars->rwd;
		if( !$rwd  ) throw new Exception(ERR_M::DATA_ACC_DISABLED, 99);

// Проверяем данные
		$car_id = isset($_POST['car_id']) ? trim(strip_tags($_POST['car_id'])) : '';
        if (!$car_id || !ctype_digit( $car_id ))
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);      
 
// Открываем базу данных
		$db = App::me()->dbOpen();	
		$data = 0;
		if( is_bool( $data ) )
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);      
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}
 
	return array('errcode'=>$errcode,'errmess'=>$errmess, 'data'=>$data);
  }
  
  
  public function inscar() {

    $car_depnum		= isset($_POST['car_depnum']) ? trim(strip_tags($_POST['car_depnum'])) : '';
    $car_model		= isset($_POST['car_model']) ? trim(strip_tags($_POST['car_model'])) : '';
    $car_release	= isset($_POST['car_release']) ? trim(strip_tags($_POST['car_release'])) : '';
    $car_engcap		= isset($_POST['car_engcap']) ? trim(strip_tags($_POST['car_engcap'])) : '';
    $car_body		= isset($_POST['car_body']) ? trim(strip_tags($_POST['car_body'])) : '';
    $car_mot		= isset($_POST['car_mot']) ? trim(strip_tags($_POST['car_mot'])) : '';
    $car_insur		= isset($_POST['car_insur']) ? trim(strip_tags($_POST['car_insur'])) : '';
    $car_comment	= isset($_POST['car_comment']) ? trim(strip_tags($_POST['car_comment'])) : '';
	
	$errcode = 0;
	$errmess = '';
	
    try
    {
// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$car_user_id = $_SESSION['user_id'];
		
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->cars->rwd;
		if( !$rwd & PERM_BITS::WRITE_OWN ) 
			throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Все ли данные переданы
		$errdata = "";
		
// Открываем базу данных
		$db = App::me()->dbOpen();
		
// car_depnum
		if( !$car_depnum ) $errdata .= ($errdata?'<br>':'')."- Не указан гос. номер автомобиля.";
		$car_depnum = preg_replace( '/[^А-ЯІЇA-Z0-9]/u', '', mb_strtoupper($car_depnum, 'UTF-8'));
			
// car_model
		if( !$car_model ) $errdata .= ($errdata?'<br>':'')."- Не указана марка,модель автомобиля.";
			
// car_release
		if( !$car_release ) $errdata .= ($errdata?'<br>':'')."- Не указан год выпуска автомобиля.";
		elseif( strlen($car_release) != 4 || !ctype_digit($car_release) || $car_release < 1900 || $car_release > date('Y') )
			$errdata .= ($errdata?'<br>':'')."- Год выпуска автомобиля указан неправильно.";
			
// car_engcap
		if( !$car_engcap )
			$errdata .= ($errdata?'<br>':'').'- Не указан объем двигателя автомобиля.';
		else {
			$car_engcap = str_replace(',', '.', $car_engcap);
			if( !is_numeric( $car_engcap ) || $car_engcap <= 0  || $car_engcap > 100 )
				$errdata .= ($errdata?'<br>':'')."- Неправильно указан объем двигателя автомобиля.";
		}
		
// car_body
		if( !$car_body ) $errdata .= ($errdata?'<br>':'')."- Не указана номер кузова.";
			
// car_mot
		if( $car_mot && ( $car_mot = Tools::check_date($car_mot) ) === false )
				$errdata .= ($errdata?'<br>':'')."- Дата проведения техосмотра указана неправильно.";

// car_insur
		if( $car_insur && ( $car_insur = Tools::check_date($car_insur) ) === false )
				$errdata .= ($errdata?'<br>':'')."- Дата получения страховки указана неправильно.";

// Может автомобиль с указанным номером уже существует
		$rs = $db->query( "SELECT 1 FROM cars WHERE car_depnum = ".$db->quote($car_depnum) );
		if( $row = $rs->fetchObject() ) 
			$errdata .= ($errdata?'<br>':'')."- Автомобиль с указаным номером уже присутствует.";
			
		$rs->closeCursor();
//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);
		
// Пишем данные
		$sql =	'INSERT INTO cars SET '.
					'car_depnum = '.$db->quote($car_depnum).", ".
					'car_model = '.$db->quote($car_model).", ".
					'car_release = '.$db->quote($car_release).", ".
					'car_engcap = '.$db->quote($car_engcap).", ".
					'car_body = '.$db->quote($car_body).", ".
					'car_mot = '.$db->quote($car_mot).", ".
					'car_insur = '.$db->quote($car_insur).", ".
					'car_comment = '.$db->quote($car_comment).", ".
					'car_user_id = '.$db->quote($car_user_id);
							
		$db->exec($sql);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }


  public function updcar() {

    $car_id			= isset($_POST['id']) ? trim(strip_tags($_POST['id'])) : '';
    $car_depnum		= isset($_POST['car_depnum']) ? trim(strip_tags($_POST['car_depnum'])) : '';
    $car_model		= isset($_POST['car_model']) ? trim(strip_tags($_POST['car_model'])) : '';
    $car_release	= isset($_POST['car_release']) ? trim(strip_tags($_POST['car_release'])) : '';
    $car_engcap		= isset($_POST['car_engcap']) ? trim(strip_tags($_POST['car_engcap'])) : '';
    $car_body		= isset($_POST['car_body']) ? trim(strip_tags($_POST['car_body'])) : '';
    $car_mot		= isset($_POST['car_mot']) ? trim(strip_tags($_POST['car_mot'])) : '';
    $car_insur		= isset($_POST['car_insur']) ? trim(strip_tags($_POST['car_insur'])) : '';
    $car_comment	= isset($_POST['car_comment']) ? trim(strip_tags($_POST['car_comment'])) : '';
	
	$errcode = 0;
	$errmess = '';
	
    try
    {
// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$car_user_id = $_SESSION['user_id'];
		
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->cars->rwd;
		if( !$rwd & PERM_BITS::WRITE_OWN ) 
			throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Идентификатор авто
		if( !$car_id || !ctype_digit($car_id) )
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
			
// Все ли данные переданы
		$errdata = "";
		
// Открываем базу данных
		$db = App::me()->dbOpen();
		
// car_depnum
		if( !$car_depnum ) $errdata .= ($errdata?'<br>':'')."- Не указан гос. номер автомобиля.";
		$car_depnum = preg_replace( '/[^А-ЯІЇA-Z0-9]/u', '', mb_strtoupper($car_depnum, 'UTF-8'));
			
// car_model
		if( !$car_model ) $errdata .= ($errdata?'<br>':'')."- Не указана марка,модель автомобиля.";
			
// car_release
		if( !$car_release ) $errdata .= ($errdata?'<br>':'')."- Не указан год выпуска автомобиля.";
		elseif( strlen($car_release) != 4 || !ctype_digit($car_release) || $car_release < 1900 || $car_release > date('Y') )
			$errdata .= ($errdata?'<br>':'')."- Год выпуска автомобиля указан неправильно.";
			
// car_engcap
		if( !$car_engcap )
			$errdata .= ($errdata?'<br>':'').'- Не указан объем двигателя автомобиля.';
		else {
			$car_engcap = str_replace(',', '.', $car_engcap);
			if( !is_numeric( $car_engcap ) || $car_engcap <= 0  || $car_engcap > 100 )
				$errdata .= ($errdata?'<br>':'')."- Неправильно указан объем двигателя автомобиля.";
		}
		
// car_body
		if( !$car_body ) $errdata .= ($errdata?'<br>':'')."- Не указана номер кузова.";
			
// car_mot
		if( $car_mot && ( $car_mot = Tools::check_date($car_mot) ) === false )
				$errdata .= ($errdata?'<br>':'')."- Дата проведения техосмотра указана неправильно.";

// car_insur
		if( $car_insur && ( $car_insur = Tools::check_date($car_insur) ) === false )
				$errdata .= ($errdata?'<br>':'')."- Дата получения страховки указана неправильно.";
			
// Может автомобиль с указанным номером уже существует
		$rs = $db->query( "SELECT 1 FROM cars WHERE car_depnum = ".$db->quote($car_depnum)." AND car_id != ".$db->quote($car_id) );
		if( $row = $rs->fetchObject() ) 
			$errdata .= ($errdata?'<br>':'')."- Автомобиль с указаным номером уже присутствует.";
			
		$rs->closeCursor();
		
//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);
		
// Есть ли разрешение на апдейт этой записи
		if( $rwd & PERM_BITS::WRITE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::WRITE_GRP ) 
			$where = 'car_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::WRITE_OWN ) $where = 'car_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND car_id = '.$db->quote($car_id);
		
		$rs = $db->query( 'SELECT COUNT(*) AS count FROM cars WHERE '.$where.' LIMIT 1' );		
		$row = $rs->fetchObject();
		if( !$row->count )
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);

		$rs->closeCursor();
		
// Пишем данные
		$sql =	'UPDATE cars SET '.
					'car_depnum = '.$db->quote($car_depnum).", ".
					'car_model = '.$db->quote($car_model).", ".
					'car_release = '.$db->quote($car_release).", ".
					'car_engcap = '.$db->quote($car_engcap).", ".
					'car_body = '.$db->quote($car_body).", ".
					'car_mot = '.$db->quote($car_mot).", ".
					'car_insur = '.$db->quote($car_insur).", ".
					'car_comment = '.$db->quote($car_comment).' '.
				'WHERE car_id = '.$db->quote($car_id);
							
		$db->exec($sql);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }

  public function delcar() {
    $errmess = "";
	$errcode = 0;
		
    $car_ids = (isset($_REQUEST['id']) && $_REQUEST['id'] != '') ?
        explode(",", $_REQUEST["id"], 100) : array();


    try
    {
// Только зарегистрированные пользователи могут удалять данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

        if (!Tools::is_numeric_array( $car_ids ))
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
        
		$car_id_list = implode(',', $car_ids);

// Есть ли разрешение на удаление хоть каких либо записей products
		$rwd_cars = $_SESSION['priv']->cars->rwd;
		if( ($rwd_cars & PERM_BITS::DELETE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
// Есть ли разрешение на удаление хоть каких либо записей carserv
		$rwd_serv = $_SESSION['priv']->carserv->rwd;
		if( ($rwd_serv & PERM_BITS::DELETE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Есть ли разрешение на удаление записей cars
		if( $rwd_cars & PERM_BITS::DELETE_OTH ) $where = '1 = 1';
		elseif( $rwd_cars & PERM_BITS::DELETE_GRP ) 
			$where = 'car_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd_cars & PERM_BITS::DELETE_OWN ) $where = 'car_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND car_id IN ('.$car_id_list.')';
		
		$rs = $db->query( "SELECT COUNT(*) AS count FROM cars WHERE ${where}" );		
		$row = $rs->fetchObject();
		if( $row->count != count($car_ids) )
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
		$rs->closeCursor();

// Есть ли разрешение на удаление записей carserv
		if( $rwd_serv & PERM_BITS::DELETE_OTH ) $where = '1 = 1';
		elseif( $rwd_serv & PERM_BITS::DELETE_GRP ) 
			$where = 'car_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd_serv & PERM_BITS::DELETE_OWN ) $where = 'car_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND crs_car_id IN ('.$car_id_list.')';
		
// Общее число записей техобслуживания по списку удаляемых автомобилей
// и число записей ( из них ) на которые есть права
		$sql =	"( SELECT 1 AS sort_col, COUNT(*) AS count FROM carserv WHERE crs_car_id IN ( ${car_id_list} ) ) ".
				"UNION ALL ".
				"( SELECT 2 AS sort_col, COUNT(*) AS count FROM carserv WHERE ${where} ) ".
				"ORDER BY sort_col";
		$rs = $db->query( $sql );		
		$nall = $rs->fetchObject()->count;
		$nacc = $rs->fetchObject()->count;
		$rs->closeCursor();

		if( $nacc != $nall )
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);

// Удаляем записи из справочника
		try { 
			$db->beginTransaction();
			$sql =  'DELETE FROM carserv WHERE crs_car_id IN ('.$car_id_list.')'.";\n".
					'DELETE FROM cars WHERE car_id IN ('.$car_id_list.')'.";";
			$db->exec($sql);
			$db->commit();
		} 
		catch(PDOExecption $e) { 
			$db->rollback(); 
			$errcode = 1;
			$errmess = ERR_M::DATABASE_ERROR;
		} 
	}
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }


  public function listserv() {
  
    $data = new jqGridData();
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

		$rwd = $_SESSION['priv']->carserv->rwd;
		if( !$rwd  ) throw new Exception(ERR_M::DATA_ACC_DISABLED, 99);

// Проверяем данные
        $car_id = isset($_REQUEST["car_id"]) ? trim(strip_tags($_REQUEST["car_id"])) : '';
		if( $car_id == '' || !ctype_digit($car_id) )
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);

        $page    = ( isset($_REQUEST["page"]) && $_REQUEST["page"] > 0 ) ? $_REQUEST["page"] : 1;
        $limit    = ( isset($_REQUEST["rows"]) && $_REQUEST["rows"] > 0 ) ? $_REQUEST["rows"] : 1;
        $sidx    = ( isset($_REQUEST["sidx"]) && $_REQUEST["sidx"] != '' ) ? $_REQUEST["sidx"] : 'crs_date';
        $sord    = ( isset($_REQUEST["sord"]) && strtolower($_REQUEST["sord"]) == 'desc' ) ? 'DESC' : 'ASC';
        $search    = ( isset($_REQUEST["_search"]) && strtolower($_REQUEST["_search"]) == 'true') ? true : false;
 
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Фильтр
        $whc = array();
		$whc[] = 'crs_car_id = '.$db->quote($car_id);
		
        if( $search )
        {
            if(isset($_REQUEST["crs_date"]) && ( $dt = Tools::date_to_search_str( $_REQUEST["crs_date"] )) != "") {
				$whc[] = "crs_date LIKE " . $db->quote($dt."%");
            }
			
            if(isset($_REQUEST["crs_speedo"]) && $_REQUEST["crs_speedo"] != "") {
		    	$whc[] = "crs_speedo LIKE " . $db->quote($_REQUEST["crs_speedo"]."%");
				$unilink = true;
            }
			
            if(isset($_REQUEST["crs_descrip"]) && $_REQUEST["crs_descrip"] != "") {
		    	$whc[] = "crs_descrip LIKE " . $db->quote("%".$_REQUEST["crs_descrip"]."%");
				$unilink = true;
            }

		}

// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whc[] = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whc[] = 'crs_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whc[] = 'crs_user_id = '.$_SESSION['user_id'];
		else $whc[] = '1 = 0';
		
        $whereclaus = (count($whc) != 0 ) ? " WHERE " . implode(" AND ", $whc) : "";
		unset($whc);
            
// Получаем количество записей с учетом фильтра           
        $rs = $db->query( "SELECT COUNT(*) AS count FROM carserv ".$whereclaus );
		$count = $rs->fetchObject()->count;
		$rs->closeCursor();
            
// Пустая таблица
        if ($count == 0)
			throw new Exception(ERR_M::SUCCESS, 0);
            
// Рассчитаем сколько всего страниц займут данные в БД
    	if( $count > 0 && $limit > 0) {
    		$total_pages = ceil($count/$limit);
    	} else {
    		$total_pages = 0;
    	}                  
 
		if ($page > $total_pages) $page=$total_pages;                  
 
		$start = $limit*$page - $limit;                   
		if($start < 0) $start = 0;                  
 
// Формируем запрос
		$sql = 	"SELECT crs_id, crs_date, crs_speedo, crs_descrip ".
				"FROM carserv ".$whereclaus." ORDER BY ".$sidx." ".$sord.
		        " LIMIT ".$start.", ".$limit;

		$rs = $db->query($sql);                  
 
// Формирование объекта для возврата
        
    	$data->page      = $page;
    	$data->total     = $total_pages;
    	$data->records   = $count;
    		
    // Строки данных для таблицы
		$i = 0;
		while($row = $rs->fetchObject()) {
			$data->rows[$i]['id'] = $row->crs_id;
			$data->rows[$i]['cell'] = array(
					$row->crs_id, Tools::str_iso2local_date( $row->crs_date ), 
					$row->crs_speedo, $row->crs_descrip
		    );
		    $i++;
		}
    }
	catch (PDOException $e) {
		$data->userdata->errcode = 1;
		$data->userdata->errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$data->userdata->errcode = $e->getCode();
		$data->userdata->errmess = $e->getMessage();
	}
 
	return $data;
  }
  
  
  public function insserv() {

    $car_id			= isset($_POST['car_id']) ? trim(strip_tags($_POST['car_id'])) : '';
    $crs_date		= isset($_POST['crs_date']) ? trim(strip_tags($_POST['crs_date'])) : '';
    $crs_speedo		= isset($_POST['crs_speedo']) ? trim(strip_tags($_POST['crs_speedo'])) : '';
    $crs_descrip	= isset($_POST['crs_descrip']) ? trim(strip_tags($_POST['crs_descrip'])) : '';
	
	$errcode = 0;
	$errmess = '';
    try
    {
// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$crs_user_id = $_SESSION['user_id'];
		
// идентификатор изделия
		if( $car_id == '' || !ctype_digit($car_id) )
					throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
			
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->carserv->rwd;
		if( ($rwd & PERM_BITS::WRITE_OWN) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Все ли данные переданы
		$errdata = "";
		
// Открываем базу данных
		$db = App::me()->dbOpen();	

// crs_date			
		if( $crs_date && ( $crs_date = Tools::check_date($crs_date) ) === false )
				$errdata .= ($errdata?'<br>':'')."- Дата проведения техобслуживания указана неправильно.";

// crs_speedo
		if( $crs_speedo === '' || !ctype_digit($crs_speedo) )
			$errdata .= ($errdata?'<br>':'').'- Не указаны показания спидометра.';
		
// crs_speedo
		if( $crs_descrip === '' )
			$errdata .= ($errdata?'<br>':'').'- Не указано описание техобслуживания.';
		
//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);
		
// Может быть это техобслуживание уже есть
		$sql =	'SELECT count(*) AS count FROM carserv WHERE crs_car_id = '.$db->quote($car_id).
					' AND crs_date = '.$db->quote($crs_date);
		$rs = $db->query( $sql );		
		$count = $rs->fetchObject()->count;
		if( $count != 0 ) {
			$errcode = -1;
			$errmess = "Предупреждение!!!. В таблице техобслуживаний уже присутствует запись за '${crs_date}'";
        }    
		$rs->closeCursor();

// Пишем данные
        $sql =  'INSERT INTO carserv SET '.
                'crs_car_id = '.$db->quote($car_id).", ".
				'crs_date = '.$db->quote($crs_date).", ".
				'crs_speedo = '.$db->quote($crs_speedo).", ".
				'crs_descrip = '.$db->quote($crs_descrip).", ".
				'crs_user_id = '.$db->quote($crs_user_id);
												
		$db->exec($sql);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }

  
  
  public function updserv() {

    $crs_id			= isset($_POST['id']) ? trim(strip_tags($_POST['id'])) : '';
    $car_id			= isset($_POST['car_id']) ? trim(strip_tags($_POST['car_id'])) : '';
    $crs_date		= isset($_POST['crs_date']) ? trim(strip_tags($_POST['crs_date'])) : '';
    $crs_speedo		= isset($_POST['crs_speedo']) ? trim(strip_tags($_POST['crs_speedo'])) : '';
    $crs_descrip	= isset($_POST['crs_descrip']) ? trim(strip_tags($_POST['crs_descrip'])) : '';
	
	$errcode = 0;
	$errmess = '';
    try
    {
// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$crs_user_id = $_SESSION['user_id'];
		
// Идентификатор техобслуживания
		if( !$crs_id || !ctype_digit($crs_id) || !$car_id || !ctype_digit($car_id) )
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
			
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->carserv->rwd;
		if( ($rwd & PERM_BITS::WRITE_OWN) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Все ли данные переданы
		$errdata = "";
		
// Открываем базу данных
		$db = App::me()->dbOpen();	

// crs_date			
		if( $crs_date && ( $crs_date = Tools::check_date($crs_date) ) === false )
				$errdata .= ($errdata?'<br>':'')."- Дата проведения техобслуживания указана неправильно.";

// crs_speedo
		if( $crs_speedo === '' || !ctype_digit($crs_speedo) )
			$errdata .= ($errdata?'<br>':'').'- Не указаны показания спидометра.';
		
// crs_descrip
		if( $crs_descrip === '' )
			$errdata .= ($errdata?'<br>':'').'- Не указано описание техобслуживания.';
		
//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);
		
// Может быть это техобслуживание уже есть
		$sql =	'SELECT count(*) AS count FROM carserv WHERE crs_car_id = '.$db->quote($car_id).
					' AND crs_date = '.$db->quote($crs_date).' AND crs_id != '.$db->quote($crs_id);
		$rs = $db->query( $sql );		
		$count = $rs->fetchObject()->count;
		if( $count != 0 ) {
			$errcode = -1;
			$errmess = "Предупреждение!!!. В таблице техобслуживаний уже присутствует запись за '${crs_date}'";
        }    
		$rs->closeCursor();

// Есть ли разрешение на апдейт этой записи
		if( $rwd & PERM_BITS::WRITE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::WRITE_GRP ) 
			$where = 'crs_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::WRITE_OWN ) $where = 'crs_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND crs_id = '.$db->quote($crs_id);
		
		$rs = $db->query( 'SELECT COUNT(*) AS count FROM carserv WHERE '.$where.' LIMIT 1' );		
		if( !$rs->fetchObject()->count )
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
		$rs->closeCursor();
		
// Пишем данные
        $sql =  'UPDATE carserv SET '.
					'crs_date = '.$db->quote($crs_date).", ".
					'crs_speedo = '.$db->quote($crs_speedo).", ".
					'crs_descrip = '.$db->quote($crs_descrip)." ".
				'WHERE crs_id = '.$db->quote($crs_id);
												
		$db->exec($sql);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }

  
  public function delserv() {
    $errmess = "";
	$errcode = 0;
		
    $crs_ids = (isset($_REQUEST['id']) && $_REQUEST['id'] != '') ?
										explode(",", $_REQUEST["id"], 100) : array();

    try
    {
// Только зарегистрированные пользователи могут удалять данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Есть ли разрешение на удаление хоть какой либо записи
		$rwd = $_SESSION['priv']->carserv->rwd;
		if( ($rwd & PERM_BITS::DELETE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
// Идентификатор изделия и удаляемые материалы
        if ( !Tools::is_numeric_array( $crs_ids ))
					throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
        
		$crs_id_list = implode(',', $crs_ids);

// Открываем базу данных
		$db = App::me()->dbOpen();	

// Есть ли разрешение на удаление этих записей
		if( $rwd & PERM_BITS::DELETE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::DELETE_GRP ) 
			$where = 'crs_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::DELETE_OWN ) $where = 'crs_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND crs_id IN ('.$crs_id_list.')';
		
		$rs = $db->query( 'SELECT COUNT(*) AS count FROM carserv WHERE '.$where );
		if( $rs->fetchObject()->count != count($crs_ids) )
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
		$rs->closeCursor();

// Удаляем записи из справочника
        $db->exec("DELETE FROM carserv WHERE crs_id IN (".$crs_id_list.")");
	}
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }
  
} // End od Cars class
?>